/**
 * 方法装饰器
 * @param targetClassPrototype 被修饰方法所在类的原型 如：RoleService.prototype
 * @param methodName 方法名
 * @param methodDescr 方法的描述符 描述这个属性的 是否可读写改删
 */
function MyMethodDecorator(
  targetClassPrototype: any,
  methodName: string,
  methodDescr: PropertyDescriptor
) {
  console.log('targetClassPrototype >>> ', targetClassPrototype);
  console.log('methodName >>> ', methodName);
  console.log('methodDescr >>> ', methodDescr);

  // 执行被装饰器修饰的方法
  // => 分配角色... arg >  我是参数
  // this > PropertyDescriptor 对象
  methodDescr.value('我是参数'); // methodDescr.value 当前修饰的函数本身

  /**
   * 不能单纯的通过改变this指向的方式调用其方法，因为调用方法里的this非当前实例
   *
   * methodDescr.value.call(targetClassPrototype, '我是参数');
   */
}

class RoleService {
  public roleName: string = 'admin';
  constructor() {}

  name = 'xk';

  @MyMethodDecorator
  DistribRoles(arg: any) {
    // 分配角色
    console.log('分配角色...', 'arg > ', arg, this);
  }
}

export {};
